package com.sss.hloster04;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;

import org.junit.jupiter.api.Test;

public class SteamTestDriver {
	/*
	 * 带缓存的字符流
	 * 使用输入流读取一个文件内容到CPU中，然后使用输出流将内容写出到指定位置的外部文件中
	 * 
	 */
	@Test
	public void test03() {
		try (
				// 创建一个输入流对象    设计模式叫做：装饰器模式
				//InputStreamReader可以将字节流转为指定编码格式的字符流
				BufferedReader is = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\Download\\streamfiles/in01.txt"),"utf-8"));
				// 输入流对象
				// 构造方法的第二个参数决定写入文件的内容是接着写还是从开头覆盖写；默认为false，从开头覆盖写；true从末位接着写
				BufferedWriter os = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("E:/Download/streamfiles/in02_out04.txt", true),"utf-8"));
				){
				
				// 将输入流的内容读取到用于存储的字节数组中
				String strLine = is.readLine();
				while (strLine != null) {
					// 使用输出流输出内容
					System.out.println(new String(strLine));
					// 可以使用String 的构造方法指定编码格式
					os.write(strLine);
					os.newLine();
					// 继续往下读
					strLine = is.readLine();
				}
			

			}catch (IOException e) {
				e.printStackTrace();
			}
		}
	/*
	 * 字符流 
	 * 使用输入流读取一个文件内容到CPU中，然后使用输出流将内容写出到指定位置的外部文件中
	 * 
	 */
	@Test
	public void test02() {
		try (
				// 创建一个输入流对象
				Reader is = new FileReader("E:\\Download\\streamfiles/in01.txt");
				// 输入流对象
				// 构造方法的第二个参数决定写入文件的内容是接着写还是从开头覆盖写；默认为false，从开头覆盖写；true从末位接着写
				Writer os = new FileWriter("E:/Download/streamfiles/in02_out03.txt", true);
				){
				// 用于读取输入流的字节数组
				char[] b = new char[1024];
				// 将输入流的内容读取到用于存储的字节数组中
				int len = is.read(b);
				while (len != -1) {
					// 使用输出流输出内容
					System.out.println(new String(b));
					// 可以使用String 的构造方法指定编码格式
					os.write(b, 0, len);
					// 继续往下读
					len = is.read(b);
				}
			

			}catch (IOException e) {
				e.printStackTrace();
			}
		}
	

	/*
	 * 字节流 使用输入流读取一个文件内容到CPU中，然后使用输出流将内容写出到指定位置的外部文件中
	 * 
	 */
	@Test
	public void test01() {
		try (
			// 创建一个输入流对象
			InputStream is = new FileInputStream("E:\\Download\\streamfiles/in01.txt");
			// 输入流对象
			// 构造方法的第二个参数决定写入文件的内容是接着写还是从开头覆盖写；默认为false，从开头覆盖写；true从末位接着写
			OutputStream os = new FileOutputStream("E:\\Download\\streamfiles/in02_out01.txt", true);
			){
			// 用于读取输入流的字节数组
			byte[] b = new byte[1024];
			// 将输入流的内容读取到用于存储的字节数组中
			int len = is.read(b);
			while (len != -1) {
				// 使用输出流输出内容
				System.out.println(new String(b, "gbk"));
				// 可以使用String 的构造方法指定编码格式
				os.write(b, 0, len);
				// 继续往下读
				len = is.read(b);
			}
		

		}catch (IOException e) {
			e.printStackTrace();
		}
	}
}
